﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionContrato;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionContrato;
using ClickLand.Web.UI.WebControls;
using Resources;

namespace AdministracionContrato
{
    /// <summary> Code behind de la vista que se encarga de las operaciones de agregar contrato </summary>
    public partial class AgregarContrato : Page,IAgregarContrato
    {
        #region Atributos

        /// <summary> Objeto que posee la definicion del presentador de la vista </summary>
        private PresentadorAgregarContrato _presentador;

        #endregion

        #region Eventos

        /// <summary> Metodo que se ejeuta cuando se da inicia la pagina </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                if(rbNuevo.Checked)
                    Contrato = null;
                return;
            }
            OtrosFirmantes.Visible = false;
            mvAgregarContrato.SetActiveView(vAgregarContrato);
            _presentador.CargarPagina();
        }


        /// <summary>Evento de inicializacion de la página.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Init(object sender, EventArgs e)
        {
            _presentador = new PresentadorAgregarContrato(this);
        }


        /// <summary> Metodo que se ejecuta cuando se selecciona un fiador </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DdlTipoClienteSelectedIndexChanged(object sender, EventArgs e)
        {
            _presentador.SeleccionarTipoCliente();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de cancelar en agregar fiador </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnCancelarAgregarFiadorOnClick(object sender, EventArgs e)
        {

        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de aceptar en agregar fiador </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnAceptarAgregarFiadorOnClick(object sender, EventArgs e)
        {

        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton cancelar en la vista de datos principal </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnCancelarDatosPrincipalesCLick(object sender, EventArgs e)
        {
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente en la vista de datos principales </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguienteDatosPrincipalesClick(object sender, EventArgs e)
        {
            Page.Validate("DatosPrincipales");
            if (Page.IsValid)
            {
                mvAgregarContrato.SetActiveView(vAgregarGarantia);
                lblMontoAnterior.Visible = !Nuevo;
                MontoInicial.Visible = !Nuevo;
            }
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente de agregar fiador </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarAgregarGarantiaClick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(vAgregarContrato);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente en agregar garantia </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguienteAgregarGarantiaClick(object sender, EventArgs e)
        {
            Page.Validate(rbFiador.Checked ? "AgregarFiador" : "AgregarDeposito");
            if (Page.IsValid)
                mvAgregarContrato.SetActiveView(vAgregarPoliza);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al radio buton de fiador </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RbFiadorChecked(object sender, EventArgs e)
        {
            pnFiador.Visible = rbFiador.Checked;
            pnMontoGarantia.Visible = !rbFiador.Checked;
            lblTituloDatosFiadorConfirmacion.Visible = true;
            lblTituloMontoGarantiaConfirmacion.Visible = false;
            lblMontoGarantiaConfirmacion.Visible = false;
        }


        /// <summary> Metodo que se ejecuta cuando se da click al radio buton de Deposito </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RbDepositoChecked(object sender, EventArgs e)
        {
            pnFiador.Visible = !rbDeposito.Checked;
            pnMontoGarantia.Visible = rbDeposito.Checked;
            lblTituloMontoGarantia.Visible = rbDeposito.Checked;
            tbMontoGarantia.Visible = rbDeposito.Checked;
            lblTituloDatosFiadorConfirmacion.Visible = false;
            lblTituloMontoGarantiaConfirmacion.Visible = true;
            lblMontoGarantiaConfirmacion.Visible = true;
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de regresar en la vista de ingresar poliza </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarIngresarPolizaClick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(vAgregarGarantia);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de siguiente en la vista de ingresar poliza </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguienteIngresarPolizaClick(object sender, EventArgs e)
        {
            if(cbIncluirPoliza.Checked)
                Page.Validate("DatosPoliza");

            if (Page.IsValid)
            {
                rbIncrementoProyeccion.Visible = !Nuevo;
                mvAgregarContrato.SetActiveView(vAgregarArrendamiento);
            }
        }


        /// <summary> Metodo que se ejecuta cuando se da click a la flecha de arriba </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaArribaClick(object sender, ImageClickEventArgs e)
        {
            Page.Validate("AgregarCannon");
            if(!Page.IsValid) return;
            var cantidad = Convert.ToUInt32(tbPeriodo.Text) + 1;
            Session["ListaPension"] = _presentador.ObtenerListaPension();

            tbPeriodo.Text = cantidad.ToString(CultureInfo.InvariantCulture);
            var tb = new DataTable();
            tb.Columns.Add("Descripcion");
            for (int i = 0; i < cantidad; i++)
                tb.Rows.Add("Periodo " + (i + 1).ToString(CultureInfo.InvariantCulture));

            var lista = (List<ContratoPensionDto>)Session["ListaPension"];
            if(lista.Count == 0)
            {

                var obj = new ContratoPensionDto();

                if (rbNuevo.Checked)
                {
                    obj.FechaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);
                    obj.FechaFin = Convert.ToDateTime(tbFechaFinContrato.Text);
                }
                else
                {
                    obj.FechaInicio = Convert.ToDateTime(tbFechaInicioRenovacion.Text);
                    obj.FechaFin = Convert.ToDateTime(tbFechaFinRenovacion.Text);
                }
                obj.Monto = 0;
                obj.Porcentaje = 0;
                lista.Add(obj);
            }
            Session["ListaPension"] = lista;
            gvListaPeriodo.DataSource = tb;
            gvListaPeriodo.DataBind();
        }


        /// <summary> Metodo que se ejecuta cuando se da click a la flecha de abajo </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaAbajoClick(object sender, ImageClickEventArgs e)
        {
            Page.Validate("AgregarCannon");
            if (!Page.IsValid) return;
            var cantidad = Convert.ToUInt32(tbPeriodo.Text) - 1;
            Session["ListaPension"] = _presentador.ObtenerListaPension();
            if (cantidad <= 0) return;
            tbPeriodo.Text = cantidad.ToString(CultureInfo.InvariantCulture);

            var tb = new DataTable();
            tb.Columns.Add("Descripcion");

            for (var i = 0; i < cantidad; i++)
                tb.Rows.Add("Periodo " + (i + 1));

            gvListaPeriodo.DataSource = tb;
            gvListaPeriodo.DataBind();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton regresar en la vista de agregar canon </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarAgregarCanonClick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(vAgregarPoliza);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente  de la vista de canon </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguienteAgregarCanonClick(object sender, EventArgs e)
        {

            Page.Validate("AgregarCannon");
            if (!Page.IsValid) return;
            _presentador.MostrarConfirmacion();
            mvAgregarContrato.SetActiveView(vConfirmacion);
        }

        
        /// <summary> Metodo que se que ejecuta cuando se crea cada fila </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GvListaPeriodoOnRowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;


            var lista = (List<ContratoPensionDto>)Session["ListaPension"];
            var monto = (ClickLandExTextBox)e.Row.FindControl("tbMontoCanon");
            var porcentaje = (ClickLandExTextBox)e.Row.FindControl("tbMontoPorcentaje");
            var fechaInicio = (ClickLandExTextBox)e.Row.FindControl("tbFechaInicio");
            var fechaFin = (ClickLandExTextBox)e.Row.FindControl("tbFechaFin");
            if ((lista != null) && (e.Row.RowIndex < lista.Count))
            {

                montoAnteriorOculto.Value = Nuevo ? monto.Text : _presentador.ObtenerMontoFinal().ToString("N");
                MontoInicial.Text = montoAnteriorOculto.Value + Etiquetas.BolivarFuerte;
                monto.Text = lista[e.Row.RowIndex].Monto.ToString("N");
                porcentaje.Text = lista[e.Row.RowIndex].Porcentaje.ToString("N");
                fechaFin.Text = lista[e.Row.RowIndex].FechaFin.ToString("dd/MM/yyyy");
                fechaInicio.Text = lista[e.Row.RowIndex].FechaInicio.ToString("dd/MM/yyyy");
                if (e.Row.RowIndex == 0)
                {
                    porcentaje.Text = (!rbIncrementoProyeccion.Checked) ? @"0":porcentaje.Text;
                    monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                         string.Format(ConfigurationManager.AppSettings[@"DarFormatoJS"], monto.ClientID,
                                                       monto.ClientID));

                    monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                         string.Format(ConfigurationManager.AppSettings[@"DarFormatoJS"], monto.ClientID,
                                                       monto.ClientID));
                    porcentaje.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                          string.Format(ConfigurationManager.AppSettings[@"CalcularMontoFormatoJS"],
                                                        monto.ClientID, porcentaje.ClientID, montoAnteriorOculto.ClientID));
                    porcentaje.Visible = false;

                    var imagen = (Image)e.Row.FindControl("iFechaDesde1");
                    imagen.Visible = false;
                    fechaInicio.Enabled = false;
                }
                else
                {
                    var fechaFinAnterior = (ClickLandExTextBox)gvListaPeriodo.Rows[e.Row.RowIndex - 1].FindControl("tbFechaFin");
                    fechaFinAnterior.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                         string.Format(ConfigurationManager.AppSettings[@"DuplicarJS"], fechaFinAnterior.ClientID,
                                                       fechaInicio.ClientID));
                    var montoAnteriorDuplicar = (ClickLandExTextBox) gvListaPeriodo.Rows[e.Row.RowIndex - 1].FindControl("tbMontoCanon");
                    
                    monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnChange"],
                                         string.Format(ConfigurationManager.AppSettings[@"PorcentajeJS"],
                                                       monto.ClientID, porcentaje.ClientID, montoAnteriorDuplicar.ClientID));
                    porcentaje.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                          string.Format(ConfigurationManager.AppSettings[@"CalcularMontoFormatoJS"],
                                                        monto.ClientID, porcentaje.ClientID, montoAnteriorDuplicar.ClientID));
                    var imagenInicial = gvListaPeriodo.Rows[0].FindControl("iFechaDesde2");
                    var fechaFinInicial = (ClickLandExTextBox)gvListaPeriodo.Rows[0].FindControl("tbFechaFin");
                    imagenInicial.Visible = true;
                    fechaFinInicial.Enabled = true;
                }
            }
            else
            {
                var fechaFinAnterior = (ClickLandExTextBox)gvListaPeriodo.Rows[e.Row.RowIndex - 1].FindControl("tbFechaFin");
                fechaFinAnterior.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                     string.Format(ConfigurationManager.AppSettings[@"DuplicarJS"], fechaFinAnterior.ClientID,
                                                   fechaInicio.ClientID));

                var montoAnterior = (ClickLandExTextBox) gvListaPeriodo.Rows[e.Row.RowIndex - 1].FindControl("tbMontoCanon");

                var imagen = (Image)e.Row.FindControl("iFechaDesde2");
                imagen.Visible = false;
                fechaFin.Text = (rbNuevo.Checked) ? tbFechaFinContrato.Text : tbFechaFinRenovacion.Text;
                fechaFin.Enabled = false;
                monto.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                     string.Format(ConfigurationManager.AppSettings[@"PorcentajeJS"],
                                                   monto.ClientID, porcentaje.ClientID, montoAnterior.ClientID));

                porcentaje.Attributes.Add(ConfigurationManager.AppSettings[@"OnBlurJS"],
                                          string.Format(ConfigurationManager.AppSettings[@"CalcularMontoFormatoJS"],
                                                        monto.ClientID, porcentaje.ClientID, montoAnterior.ClientID));

                var imagenInicial = gvListaPeriodo.Rows[0].FindControl("iFechaDesde2");
                var fechaFinInicial = (ClickLandExTextBox) gvListaPeriodo.Rows[0].FindControl("tbFechaFin");
                imagenInicial.Visible = true;
                fechaFinInicial.Enabled = true;
            }
        }
        

        /// <summary> Evento que se ejecuta cuando se da click al boton regresar en la vista de confirmacion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnRegresarConfirmacionCLick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(vAgregarArrendamiento);
        }


        /// <summary> Evento que se ejecuta cuando se da click al boton regresar en la vista de confirmacion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnAceptarConfirmacionClick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(_presentador.AgregarContrato() ? vMensajeExito : vMensajeError);
        }


        /// <summary> Evento que se ejecuta cuando se da click al boton aceptar en la vista de exito </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnAceptarExito(object sender, EventArgs e)
        {
            Response.Redirect("~/Default.aspx");
        }


        /// <summary> Evento que se ejecuta cuando se da click al boton regresar en la vista de error </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnRegresarErrorOnClick(object sender, EventArgs e)
        {
            mvAgregarContrato.SetActiveView(vConfirmacion);
        }


        /// <summary> Custom validator que valida que la fecha fin sea mayor a la fecha de inicio </summary>
        /// <param name="source">Objeto que activa el evento</param>
        /// <param name="args">Objeto con el argumento del evento</param>
        protected void ValidarFechas(object source, ServerValidateEventArgs args)
        {
            if ((!string.IsNullOrEmpty(tbFechaInicioContrato.Text)) && (!string.IsNullOrEmpty(tbFechaFinContrato.Text)))
            {
                DateTime fechaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);
                DateTime fechaFin = Convert.ToDateTime(tbFechaFinContrato.Text);
                args.IsValid = fechaFin > fechaInicio;
            }
        }

        
        /// <summary> Metodo que se ejecuta cuando se da click a la flecha de arriba en la seleccion de años </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaAnoAbajoClick(object sender, ImageClickEventArgs e)
        {
            int anos = Convert.ToInt32(tbAnos.Text);
            if ((anos - 1) <= 0) return;

            tbAnos.Text = (anos -1).ToString(CultureInfo.InvariantCulture);
            anos = Convert.ToInt32(tbAnos.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaFinContrato.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se da click a la flecha de abajo en la seleccion de años </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaAnoArribaClick(object sender, ImageClickEventArgs e)
        {

            tbAnos.Text = (Convert.ToInt32(tbAnos.Text) + 1).ToString(CultureInfo.InvariantCulture);
            int anos = Convert.ToInt32(tbAnos.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaFinContrato.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se escoge contrato nuevo </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RbNuevoCheckedChange(object sender, EventArgs e)
        {
            rbRenovacion.Checked = tipoContratoRenovacion.Checked;
            rbNuevo.Checked = tipoContratoNuevo.Checked;
            mvAgregarContrato.SetActiveView(vAgregarContrato);
        }
         

        /// <summary> Metodo que se ejecuta cuando se escoge un renovacion </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RbRenovacionCheckedChange(object sender, EventArgs e)
        {
            tipoContratoRenovacion.Checked = rbRenovacion.Checked;
            tipoContratoNuevo.Checked = rbNuevo.Checked;
            mvAgregarContrato.SetActiveView(vRenovarContrato);
        }


        /// <summary> Metodo que se ejecuta cuando se selecciona un contrato </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void ContratoSeleccionado(object sender, EventArgs e)
        {
            _presentador.ContratoSeleccionado();
        }


        /// <summary> Metodo que se ejecuta cuando se selecciona la flecha de abajo de la fecha de renovacion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void FlechaAnoAbajoRenovacionClick(object sender, ImageClickEventArgs e)
        {
            int anos = Convert.ToInt32(tbAnoRenovacion.Text);
            if ((anos - 1) <= 0) return;

            tbAnoRenovacion.Text = (anos - 1).ToString(CultureInfo.InvariantCulture);
            anos = Convert.ToInt32(tbAnoRenovacion.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaInicioRenovacion.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaFinRenovacion.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se selecciona la flecha de arriba de la fecha de renovacion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void FlechaAnoArribaRenovacionClick(object sender, ImageClickEventArgs e)
        {
            tbAnoRenovacion.Text = (Convert.ToInt32(tbAnoRenovacion.Text) + 1).ToString(CultureInfo.InvariantCulture);
            int anos = Convert.ToInt32(tbAnoRenovacion.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaInicioRenovacion.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaFinRenovacion.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se presiona el boton de cancelar en la vista de datos principales </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnCancelarDatosPrincipalesRenovacionCLick(object sender, EventArgs e)
        {

        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente de los datos principales de la vista de renovacion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void BtnSiguienteDatosPrincipalesRenovacionClick(object sender, EventArgs e)
        {
            Page.Validate("DatosPrincipalesRenovacion");
            if (Page.IsValid)
            {
                mvAgregarContrato.SetActiveView(vAgregarGarantia);
                tbMontoGarantia.Text = Contrato.MontoGarantia.ToString("N");
            }
        }


        /// <summary> Metodo que se ejecuta cuando se da click al radiobutton de personalizado </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void IncrementoPersonalizadoChecked(object sender, EventArgs e)
        {
            panelSimple.Visible = rbIncrementoSimple.Checked;
            PanelCompuesto.Visible = rbIncrementoCompuesto.Checked;
        }
        

        /// <summary> Metodo que se ejecuta cuando se da click al radiobutton de simple </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void IncrementoSimpleChecked(object sender, EventArgs e)
        {
            panelSimple.Visible = rbIncrementoSimple.Checked;
            PanelCompuesto.Visible = rbIncrementoCompuesto.Checked;
        }


        /// <summary> Metodo que se ejecuta cuando se cambia el textbox de fecha de inicio del contrato </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CambioFechaInicioContratoClick(object sender, EventArgs e)
        {
            DateTime fachaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);
            tbFechaFinContrato.Text = fachaInicio.AddYears(Convert.ToInt32(tbAnos.Text)).ToString("dd/MM/yyyy");
            _presentador.CargarEstablecimientos();

        }


        /// <summary> Metodo que se ejecuta cuando se cambia la cantidad de años de una poliza </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CambioFechaInicioPolizaClick(object sender, EventArgs e)
        {
            DateTime fachaInicio = Convert.ToDateTime(tbFechaEmision.Text);
            tbFechaVencimientoPoliza.Text = fachaInicio.AddYears(Convert.ToInt32(tbAnosPoliza.Text)).ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se da click a la flecha de abajo de la fecha de poliza </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaAnoContratoAbajoClick(object sender, ImageClickEventArgs e)
        {
            int anos = Convert.ToInt32(tbAnosPoliza.Text);
            if ((anos - 1) <= 0) return;

            tbAnosPoliza.Text = (anos - 1).ToString(CultureInfo.InvariantCulture);
            anos = Convert.ToInt32(tbAnosPoliza.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaEmision.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaVencimientoPoliza.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de arriba en la fecha de poliza </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FlechaAnoPolizaArribaClick(object sender, ImageClickEventArgs e)
        {
            tbAnosPoliza.Text = (Convert.ToInt32(tbAnosPoliza.Text) + 1).ToString(CultureInfo.InvariantCulture);
            int anos = Convert.ToInt32(tbAnosPoliza.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaEmision.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaVencimientoPoliza.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cunado se da click al boton de la flecha de abajo del año de la poliza </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void FlechaAnoPolizaAbajoClick(object sender, ImageClickEventArgs e)
        {
            int anos = Convert.ToInt32(tbAnosPoliza.Text);
            if ((anos - 1) <= 0) return;

            tbAnoRenovacion.Text = (anos - 1).ToString(CultureInfo.InvariantCulture);
            anos = Convert.ToInt32(tbAnosPoliza.Text);
            DateTime fechaInicio = Convert.ToDateTime(tbFechaEmision.Text);

            fechaInicio = fechaInicio.AddYears(anos);
            tbFechaVencimientoPoliza.Text = fechaInicio.ToString("dd/MM/yyyy");
        }


        /// <summary> Metodo que se ejecuta cuando se incremeta la proyeccion </summary>
        /// <param name="sender">Objeto que activa el evento</param>
        /// <param name="e">Objeto con el argumento del evento</param>
        protected void IncrementoProyeccion(object sender, EventArgs e)
        {
            panelSimple.Visible = rbIncrementoSimple.Checked;
            PanelCompuesto.Visible = rbIncrementoProyeccion.Checked;

            Page.Validate("AgregarCannon");
            if (!Page.IsValid) return;
            var cantidad = _presentador.ObtenerProyeccion().Count;
            Session["ListaPension"] = _presentador.ObtenerProyeccion();

            tbPeriodo.Text = cantidad.ToString(CultureInfo.InvariantCulture);
            var tb = new DataTable();
            tb.Columns.Add("Descripcion");
            for (int i = 0; i < cantidad; i++)
                tb.Rows.Add("Periodo " + (i + 1).ToString(CultureInfo.InvariantCulture));

            var lista = (List<ContratoPensionDto>)Session["ListaPension"];
            lista[0].FechaInicio = Convert.ToDateTime(FechaInicioContratoRenovacion);
            lista[lista.Count - 1].FechaFin = FechaFinContratoRenovacion;
            if (lista.Count == 0)
            {

                var obj = new ContratoPensionDto();

                if (rbNuevo.Checked)
                {
                    obj.FechaInicio = Convert.ToDateTime(tbFechaInicioContrato.Text);
                    obj.FechaFin = Convert.ToDateTime(tbFechaFinContrato.Text);
                }
                else
                {
                    obj.FechaInicio = Convert.ToDateTime(tbFechaInicioRenovacion.Text);
                    obj.FechaFin = Convert.ToDateTime(tbFechaFinRenovacion.Text);
                }
                obj.Monto = 0;
                obj.Porcentaje = 0;
                lista.Add(obj);
            }
            Session["ListaPension"] = lista;
            gvListaPeriodo.DataSource = tb;
            gvListaPeriodo.DataBind();
        }


        /// <summary> Evento que se encarga de las operaciones cuando el tipo de firma seleccionado se cambia </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DdlTipoFirmaSelectedIndexChange(object sender, EventArgs e)
        {
            int valor = Convert.ToInt32(TipoFirma.SelectedValue);
            OtrosFirmantes.Visible = (valor != 1);
        }

        #endregion

        #region Propiedades

        /// <summary> Propiedad que obtiene el tipo de establecimiento seleccionado </summary>
        public ClickLandDropDownList Establecimientos
        {
            get { return ddlEstablecimiento; }
        }


        /// <summary> Propiedad que obtiene el tipo de documento seleccionado </summary>
        public ClickLandDropDownList TipoDocumento
        {
            get { return ddlTipoDocumento; }
        }


        /// <summary> Propiedad que obtiene el control que lista los clientes seleccionado </summary>
        public ClickLandDropDownList Clientes
        {
            get { return ddlCliente; }
        }


        /// <summary> Propiedad que obtiene el control que lista los tipos de firmas seleccionado </summary>
        public ClickLandDropDownList TipoFirma
        {
            get { return ddlTipoFirma; }
        }


        /// <summary> Propiedad que obtiene el control que lista el canon </summary>
        public ClickLandGridView ListaCanon
        {
            get { return gvListaPeriodo; }
        }


        /// <summary> Propiedad que obtiene la fecha de inicio del contrato </summary>
        public DateTime FechaInicioContrato
        {
            get { return DateTime.Parse(tbFechaInicioContrato.Text); }
        }


        /// <summary> Propiedad que obtiene la fecha fin del contrato </summary>
        public DateTime FechaFinContrato
        {
            get { return DateTime.Parse(tbFechaFinContrato.Text); }
        }


        /// <summary> Propiedad que obtiene el porcentaje de venta indicado </summary>
        public string PorcentajeVenta
        {
            get { return tbPorcentaje.Text; }
        }


        /// <summary> Propiedad que obtiene el porcentaje de venta indicado </summary>
        public string NombreFirmante
        {
            get { return tbNombreFirmante.Text; }
        }


        /// <summary> Propiedad que obtiene el porcentaje de venta indicado </summary>
        public string NombreFirmante2
        {
            get { return tbNombreFirmante2.Text; }
        }


        /// <summary> Propiedad que obtiene el porcentaje de venta indicado </summary>
        public string NombreFirmante3
        {
            get { return tbNombreFirmante3.Text; }
        }


        /// <summary> Propiedad que obtiene el nombre del comercial </summary>
        public string NombreComercial
        {
            get { return tbNombreComercial.Text; }
        }


        /// <summary> Propiedad que obtiene si el tipo de garantia es fiador </summary>
        public bool GarantiaFiador
        {
            get { return rbFiador.Checked; }
        }


        /// <summary> Propiedad que obtiene el nombre del fiador </summary>
        public string NombreFiador
        {
            get { return tbNombreFiador.Text; }
        }


        /// <summary> Propiedad que obtiene el numero de cedula ingresado por el usuario </summary>
        public string CedulaFiador
        {
            get { return ddlTipoDocumento.SelectedItem.Text + tbCedulaFiador.Text; }
        }


        /// <summary> Propiedad que obtiene el numero de telefono </summary>
        public string NumeroTelefonoFiador
        {
            get { return tbCodigoAreaTelefono.Text + tbNumeroTelefono.Text; }
        }


        /// <summary> Propiedad que obtiene el correo electronico del fiador </summary>
        public string CorreoFiador
        {
            get { return tbCorreoFiador.Text; }
        }


        /// <summary> Monto de la garantia ingresada </summary>
        public string MontoGaranta
        {
            get { return tbMontoGarantia.Text; }
        }


        /// <summary> Fecha de emision de la poliza </summary>
        public DateTime FechaEmisionPoliza
        {
            get { return DateTime.Parse(tbFechaEmision.Text); }
        }


        /// <summary> Fecha de vencimiento de la poliza </summary>
        public DateTime FechaVencimientoPoliza
        {
            get { return DateTime.Parse(tbFechaVencimientoPoliza.Text); }
        }


        /// <summary> Propiedad que obtiene el monto de la poliza </summary>
        public string MontoPoliza
        {
            get { return tbMontoPoliza.Text; }
        }


        /// <summary> Propiedad que obtiene el nombre de la empresa aseguradora </summary>
        public string EmpresaAsegurador
        {
            get { return tbEmpresaAseguradora.Text; }
        }


        /// <summary> Propiedad que obtiene el nombre del beneficiario de la poliza </summary>
        public string NombreBeneficiarioPoliza
        {
            get { return tbBeneficiario.Text; }
        }


        /// <summary> Propiedad que asigna el valor del nombre del cliente para la confirmacion </summary>
        public string NombreClienteConfirmacion
        {
            set { lblNombreClienteConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el valor de la fecha del contrato para la confirmacion </summary>
        public string FechaInicioConfirmacion
        {
            set { lblFechaInicioConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el valor de la fecha de finalizacion del contrato para la confirmacion </summary>
        public string FechaFinConfirmacion
        {
            set { lblFechaFinConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el nombre del establecimiento para la confirmacion </summary>
        public string EstablecimientoConfirmacion
        {
            set { lblEstablecimientoConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el porcentaje de venta para el contrato para la confirmacion </summary>
        public string PorcentajeConfirmacion
        {
            set { lblPorcentajeVentaConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el tipo de firma el contrato para la confirmacion </summary>
        public string TipoFirmaConfirmacion
        {
            set { lblTipoFirmaConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el nombre del firmante contrato para la confirmacion </summary>
        public string NombreFirmanteConfirmacion
        {
            set { lbloNombreFirmanteConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el nombre del firmante contrato para la confirmacion </summary>
        public string NombreFirmante2Confirmacion
        {
            set { lbloNombreFirmante2Confirmacion.Text = value; }
        }


        /// <summary> Propiedad que asigna el nombre del firmante contrato para la confirmacion </summary>
        public string NombreFirmante3Confirmacion
        {
            set { lbloNombreFirmante3Confirmacion.Text = value; }
        }


        /// <summary> Propiedad que obtiene la cantidad de periodos indicados por el usuario </summary>
        public int Periodo
        {
            get { return Convert.ToInt32(tbPeriodo.Text); }
        }


        /// <summary> Propiedad que obtiene el tipo de pension seleccionado por el usuario </summary>
        public int TipoPension
        {
            get { return rbIncrementoSimple.Checked ? 0 : 1; }
        }


        /// <summary> Propiedad que obtiene la informacion del contrato </summary>
        public ContratoDto Contrato
        {
            get { return (ContratoDto)Session["Contrato"]; }
            set { Session["Contrato"] = value; }
        }


        /// <summary> Propiedad que obtiene el nombre comercial en la comercial </summary>
        public string NombreComercialConfirmacion
        {
            set { lblNombreComercialConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que da valor a la lista de canon ingresado por el cliente </summary>
        public ContratoPensionDto[] ListaCanonConfirmacion
        {
            set
            {
                gvListaCanonConfirmacion.DataSource = value;
                gvListaCanonConfirmacion.DataBind();
            }
        }


        /// <summary> Propiedad que asgina el tipo de Incremento en la confirmacion </summary>
        public string TipoIncrementoConfirmacion
        {
            set { lblTipoIncrementoConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asgina la informacion del fiador en la confirmacion </summary>
        public FiadorDto[] FiadorConfirmacion
        {
            set
            {
                gvDatosFiador.DataSource = value;
                gvDatosFiador.DataBind();
            }
        }


        /// <summary> Propiedad que asgina el valor al monto de garantia ingresado por el usuario </summary>
        public string MontoGarantiaConfirmacion
        {
            set { lblMontoGarantiaConfirmacion.Text = value; }
        }


        /// <summary> Propiedad que asgina la informacion de la poliza en la confirmacion </summary>
        public PolizaDto[] PolizaConfirmacion
        {
            set
            {
                lblTituloDatosPoliza.Visible = value != null;
                gvDatosPoliza.DataSource = value;
                gvDatosPoliza.DataBind();
            }
        }


        /// <summary> Lista de cliente de renovacion </summary>
        public ClickLandDropDownList ClientesRenovacion
        {
            get { return ddlContratos; }
        }


        /// <summary> Fecha de inicio de contrato de renovacion </summary>
        public string FechaInicioContratoRenovacion
        {
            set { tbFechaInicioRenovacion.Text = value; }
            get { return tbFechaInicioRenovacion.Text; }
        }


        /// <summary> Propiedad indica si el contrato a crear es nuevo </summary>
        public bool Nuevo
        {
            get { return rbNuevo.Checked; }
        }


        /// <summary> Propiedad que obtiene la fecha fin del contrato de renovacion </summary>
        public DateTime FechaFinContratoRenovacion
        {
            get { return Convert.ToDateTime(tbFechaFinRenovacion.Text); }
        }


        /// <summary> Propiedad que obtiene el monto del canon </summary>
        public string MontoCanon
        {
            get { return tbMontoSimple.Text; }
        }


        /// <summary> Propiedad que obtiene o setea la lista de cliente </summary>
        public List<ClienteDto> ListaCliente
        {
            get { return (List<ClienteDto>)Session["ListaCliente"]; }
            set { Session["ListaCliente"] = value; }
        }


        /// <summary> Porpiedad que asgina la visibilidad de los otros firmantes en la confirmacion </summary>
        public bool HayOtrosFirmantesConfirmacion
        {
            set { OtrosFirmantesConfirmacion.Visible = value; }
        }

        #endregion
    }
}